home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-04
/
netprog.zip
/
NETPROG.TAR
/
tftp
/
mainserv.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-12-17
|
2KB
|
84 lines
/*
* tftp - Trivial File Transfer Program. Server side.
*
* -i says we were *not* started by inted.
* -p port# specifies a different port# to listen on.
* -t turns on the traceflag - writes to a file.
*/
#include "defs.h"
main(argc, argv)
int argc;
char **argv;
{
int childpid;
register char *s;
err_init("rich's tftpd");
while (--argc > 0 && (*++argv)[0] == '-')
for (s = argv[0]+1; *s != '\0'; s++)
switch (*s) {
case 'i':
inetdflag = 0; /* turns OFF the flag */
/* (it defaults to 1) */
break;
case 'p': /* specify server's port# */
if (--argc <= 0)
err_quit("-p requires another argument");
port = atoi(*++argv);
break;
case 't':
traceflag = 1;
break;
default:
err_quit("unknown command line option: %c", *s);
}
if (inetdflag == 0) {
/*
* Start us up as a daemon process (in the background).
* Also initialize the network connection - create the socket
* and bind our well-known address to it.
*/
daemon_start(1);
net_init(TFTP_SERVICE, port);
}
/*
* If the traceflag is set, open a log file to write to.
* This is used by the DEBUG macros. Note that all the
* err_XXX() functions still get handled by syslog(3).
*/
if (traceflag) {
if (freopen(DAEMONLOG, "a", stderr) == NULL)
err_sys("can't open %s for writing", DAEMONLOG);
DEBUG2("pid = %d, inetdflag = %d", getpid(), inetdflag);
}
/*
* Concurrent server loop.
* The child created by net_open() handles the client's request.
* The parent waits for another request. In the inetd case,
* the parent from net_open() never returns.
*/
for ( ; ; ) {
if ( (childpid = net_open(inetdflag)) == 0) {
fsm_loop(0); /* child processes client's request */
net_close(); /* then we're done */
exit(0);
}
/* parent waits for another client's request */
}
/* NOTREACHED */
}